iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
生成式 AI

Local LLM infra & Inference 一部曲系列 第 24

Day24 - vLLM實作篇PART3:FastAPI與vLLM docs尋寶之旅

  • 分享至 

  • xImage
  •  

前言

第24天了!最後就在官方文件裡面撈看看還有什麼可以玩的。 ✨

首先是安裝方式,除了之前試過的linux GPU版本安裝之外,官方文件還提供了linux CPU版本的安裝方式。 💻 Medium這篇相關教學就是在教怎麼使用Dockerfile在CPU環境使用llama3-8b作為OpenAI-Compatible Server。 🌐

在來就是很多範例教學,包含了LLM的推理和應用開發,像是API Client和OpenAI Client、AQLM壓縮模型使用的範例。 📚 此外,這些範例也包含了Gradio Webserver,展示如何建立網頁介面,串接vLLM! 🚀 還有Offline Inference系列,提供離線推理的方式,並支持分散式推理和特殊硬體的推理應用。 ⚙️

最後就是多台機器可部屬的方式:KubernetesHelmNginx Loadbalancer
如果筆者有資源,真想玩看看QQ

🔍 今天就來看一下:

  • FastAPI docs 📖
    • Tokenize ✂️
    • Embedding model 📊
  • Gradio OpenAI Chatbot Webserver 🤖
  • Chunked Prefill 與 batch size調整 🛠️

https://ithelp.ithome.com.tw/upload/images/20240925/20168115QTjxVHlovN.jpg
(圖源: threads)


📖 FastAPI

在啟動vLLM時,其實在log中可以看到有很多API可以使用。
而這些可以在(預設) http://localhost:8000/docs#/ 查看FastAPI的swagger界面。

WARNING 08-12 11:26:16 serving_embedding.py:171] embedding_mode is False. Embedding API will not work.
INFO 08-12 11:26:16 launcher.py:14] Available routes are:
INFO 08-12 11:26:16 launcher.py:22] Route: /openapi.json, Methods: GET, HEAD
INFO 08-12 11:26:16 launcher.py:22] Route: /docs, Methods: GET, HEAD
INFO 08-12 11:26:16 launcher.py:22] Route: /docs/oauth2-redirect, Methods: GET, HEAD
INFO 08-12 11:26:16 launcher.py:22] Route: /redoc, Methods: GET, HEAD
INFO 08-12 11:26:16 launcher.py:22] Route: /health, Methods: GET
INFO 08-12 11:26:16 launcher.py:22] Route: /tokenize, Methods: POST
INFO 08-12 11:26:16 launcher.py:22] Route: /detokenize, Methods: POST
INFO 08-12 11:26:16 launcher.py:22] Route: /v1/models, Methods: GET
INFO 08-12 11:26:16 launcher.py:22] Route: /version, Methods: GET
INFO 08-12 11:26:16 launcher.py:22] Route: /v1/chat/completions, Methods: POST
INFO 08-12 11:26:16 launcher.py:22] Route: /v1/completions, Methods: POST
INFO 08-12 11:26:16 launcher.py:22] Route: /v1/embeddings, Methods: POST

https://ithelp.ithome.com.tw/upload/images/20240924/20168115Eq4ztUPG2q.png

  • ✂️ Tokenize

在這之中除了chat之外會用到的應該是tokenize,可以計算input tokens的數量。

https://ithelp.ithome.com.tw/upload/images/20240924/20168115R7qAsijB9X.png

https://ithelp.ithome.com.tw/upload/images/20240924/20168115aP5Ltg4qVn.png

  • 📊 Embedding model

至於embedding model的部分,大家常用的一些中文embedding模型,像是BAAI/bge-small-zh-v1.5,原本在筆者寫30天的2024/9這段時間,vLLM還不支援基於BertModel這樣的embedding模型,當時它只支援Causal Language Models(生成型模型)。

https://ithelp.ithome.com.tw/upload/images/20240924/20168115NJVefDFAco.png

從當時Github這個兩個issuse可以看到,目前vLLM仍專心在autoregressive generation,現在他們還是推薦使用其他libraries來做embedding,也許在未來會再深入開發這個功能。

Support embedding models
/v1/embeddings please

three months later......

2024/12補充:
現在 Pooling Models 都支援了!! 所謂的Pooling Models包含了embedding, reranking 和 reward models,是在做RAG應用時的重點!只能說他們更新真的是有夠快的OAO

(如果筆者之後還有做什麼新的實驗和截圖再補上來。)


🤖 Gradio OpenAI Chatbot Webserver

參考官方文件的範例程式碼,要記得pip install gradio,超簡單三步驟開啟你的對話介面!

  1. 將這段程式碼的'http://localhost:8000/v1'改成你的port
import argparse

import gradio as gr
from openai import OpenAI

# Argument parser setup
parser = argparse.ArgumentParser(
    description='Chatbot Interface with Customizable Parameters')
parser.add_argument('--model-url',
                    type=str,
                    default='http://localhost:8000/v1',
                    help='Model URL')
parser.add_argument('-m',
                    '--model',
                    type=str,
                    required=True,
                    help='Model name for the chatbot')
parser.add_argument('--temp',
                    type=float,
                    default=0.8,
                    help='Temperature for text generation')
parser.add_argument('--stop-token-ids',
                    type=str,
                    default='',
                    help='Comma-separated stop token IDs')
parser.add_argument("--host", type=str, default=None)
parser.add_argument("--port", type=int, default=8001)

# Parse the arguments
args = parser.parse_args()

# Set OpenAI's API key and API base to use vLLM's API server.
openai_api_key = "EMPTY"
openai_api_base = args.model_url

# Create an OpenAI client to interact with the API server
client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)


def predict(message, history):
    # Convert chat history to OpenAI format
    history_openai_format = [{
        "role": "system",
        "content": "You are a great ai assistant."
    }]
    for human, assistant in history:
        history_openai_format.append({"role": "user", "content": human})
        history_openai_format.append({
            "role": "assistant",
            "content": assistant
        })
    history_openai_format.append({"role": "user", "content": message})

    # Create a chat completion request and send it to the API server
    stream = client.chat.completions.create(
        model=args.model,  # Model name to use
        messages=history_openai_format,  # Chat history
        temperature=args.temp,  # Temperature for text generation
        stream=True,  # Stream response
        extra_body={
            'repetition_penalty':
            1,
            'stop_token_ids': [
                int(id.strip()) for id in args.stop_token_ids.split(',')
                if id.strip()
            ] if args.stop_token_ids else []
        })

    # Read and return generated text from response stream
    partial_message = ""
    for chunk in stream:
        partial_message += (chunk.choices[0].delta.content or "")
        yield partial_message


# Create and launch a chat interface with Gradio
gr.ChatInterface(predict).queue().launch(server_name=args.host,
                                         server_port=args.port,
                                         share=True)

當然這一段如果要用真正的OpenAI API也是可以的。

  1. 存檔,假設是temp.py
  2. cmd執行python temp.py --model [你的model]

https://ithelp.ithome.com.tw/upload/images/20240925/20168115NTCDusOIur.jpg

這時會出現 Running on local URL: http://127.0.0.1:8001
打開下面的gradio網址,就可以快樂地跟模型聊天了! 💬

https://ithelp.ithome.com.tw/upload/images/20240925/20168115Zn9wVk48hA.jpg


🛠️ Chunked Prefill 與 batch size調整

  • 📦 Chunked Prefill - 在一次大量input時可以將large prefills切成chunks,並與decode requests一起進行batching。它能在特定狀況下減少TTFT,但可能會增加ITL時間。
  • ⚖️ batch size調整 - 透過調整 max_num_batched_tokensmax_num_seqs,來共同決定max batch size。

章節總結

今天簡單介紹了vLLM背後的FastAPI以及它Embedding model的限制,最後用它的範例做了一個Gradio對話介面 💬。筆者最後翻了一下,值得一提的是監控的部分 📊,不過這個筆者還沒研究完,預計在後續的監控章節中繼續探討。 🔍

明天就是實作篇的最後一天啦,這幾天都是用linux系統 🐧,接下來就來介紹一下windows版本的安裝! 💻✨

https://ithelp.ithome.com.tw/upload/images/20240925/20168115Erspf0pG6I.jpg
(圖源: x)


上一篇
Day23 - vLLM實作篇PART2:模型平行化 / 預測推理 / 其他設定
下一篇
Day25 - vLLM實作篇PART4:安裝到推理 (Windows version)
系列文
Local LLM infra & Inference 一部曲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言